﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Documents;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
using TeacherLeftHand.View;
using log4net;
using System.Windows.Media;


namespace TeacherLeftHand.Util
{
    public class RichTextBoxProcessor
    {
        protected static readonly ILog Log = LogManager.GetLogger(typeof(MainWindow));

        /// <summary>
        /// Convert content of Richtextobx to string
        /// </summary>
        /// <param name="richTextBox">Specify the rich text box</param>
        /// <returns>string</returns>
        public static string ConvertToString(RichTextBox richTextBox)
        {
            var range = new TextRange(richTextBox.Document.ContentStart, richTextBox.Document.ContentEnd);
            var stream = new MemoryStream();
            range.Save(stream, DataFormats.Rtf);
            var strStream = Encoding.UTF8.GetString(stream.ToArray());

            return strStream;
        }

        /// <summary>
        /// Convert stream to FlowDocument
        /// </summary>
        /// <param name="strStream">Specify the string Stream</param>
        /// <returns>FlowDocument</returns>
        public static FlowDocument ConvertToFlowDocument(string strStream)
        {
            byte[] byteArray = Encoding.UTF8.GetBytes(strStream);
            var stream = new MemoryStream(byteArray);
            var flowDocument = new FlowDocument();
            var textRange = new TextRange(flowDocument.ContentStart, flowDocument.ContentEnd);
            stream.Seek(0, SeekOrigin.Begin);
            textRange.Load(stream, DataFormats.Rtf);

            return flowDocument;
        }

        //public static string GetInlineText(RichTextBox myRichTextBox, string typeAction)
        //{
        //    var sb = new StringBuilder();
        //    //sb.Append(SaveRTB(myRichTextBox));
        //    //byte[] bytes;

        //    foreach (Block b in myRichTextBox.Document.Blocks)
        //    {
        //        if (b is Paragraph)
        //        {
        //            var bpara = (Paragraph)Utility.CloneElement(b);
        //            foreach (Inline i in bpara.Inlines)
        //            {
        //                var inlineType = i.GetType();

        //                if (inlineType == typeof(InlineUIContainer))
        //                {
        //                    var uic = ((InlineUIContainer)i);
        //                    if (uic.Child.GetType() == typeof(InlineRichTextBox))
        //                    {
        //                        sb.Append(value: (ConvertToString((RichTextBox)uic.Child)));
        //                    }
        //                    else if (uic.Child.GetType() == typeof(Image))
        //                    {
        //                        var tmp1 = new RichTextBox();
        //                        var pa1 = new Paragraph();
        //                        var replacementImage = uic.Child as Image;
        //                        if (replacementImage != null)
        //                            pa1.Inlines.Add(CopyImage(replacementImage.Source as BitmapSource));
        //                        tmp1.Document.Blocks.Add(pa1);
        //                        sb.Append(ConvertToString(tmp1));
        //                    }


        //                }
        //                else if (inlineType == typeof(Span))
        //                {
        //                    foreach (var spanInline in ((Span)i).Inlines)
        //                    {
        //                        var spanInlineType = spanInline.GetType();

        //                        if (spanInlineType == typeof(InlineUIContainer))
        //                        {
        //                            var uic = ((InlineUIContainer)spanInline);

        //                            if (uic.Child.GetType() == typeof(InlineRichTextBox))
        //                            {
        //                                Log.Debug(ConvertToString((RichTextBox)uic.Child));
        //                                sb.Append(value: (ConvertToString((RichTextBox)uic.Child)));
        //                            }
        //                            else if (uic.Child.GetType() == typeof(Image))
        //                            {
        //                                var tmp1 = new RichTextBox();
        //                                var pa1 = new Paragraph();
        //                                var replacementImage = uic.Child as Image;
        //                                if (replacementImage != null)
        //                                    pa1.Inlines.Add(CopyImage(replacementImage.Source as BitmapSource));
        //                                tmp1.Document.Blocks.Add(pa1);
        //                                sb.Append(ConvertToString(tmp1));
        //                            }
        //                        }
        //                        else
        //                        {
        //                            //var run = (Run)spanInline;

        //                            var run = new Run
        //                            {
        //                                Text = ((Run)spanInline).Text,
        //                                Background = ((Run)spanInline).Background,
        //                                BaselineAlignment = ((Run)spanInline).BaselineAlignment,
        //                                FontFamily = ((Run)spanInline).FontFamily,
        //                                FontSize = ((Run)spanInline).FontSize,
        //                                FontStyle = ((Run)spanInline).FontStyle,
        //                                FontStretch = ((Run)spanInline).FontStretch,
        //                                FontWeight = ((Run)spanInline).FontWeight,
        //                                Foreground = ((Run)spanInline).Foreground,
        //                                Style = ((Run)spanInline).Style,
        //                                Tag = ((Run)spanInline).Tag,
        //                                TextDecorations = ((Run)spanInline).TextDecorations,
        //                                TextEffects = ((Run)spanInline).TextEffects

        //                            };

        //                            //MessageBox.Show(run.Text);
        //                            //var run = (Run)spanInline;
        //                            var tmp = new RichTextBox();
        //                            var pa = new Paragraph();
        //                            pa.Inlines.Add(run);
        //                            tmp.Document.Blocks.Add(pa);
        //                            sb.Append(ConvertToString(tmp));

        //                        }
        //                    }
        //                }
        //                else
        //                {
        //                    var run = new Run
        //                    {
        //                        Text = ((Run)i).Text,
        //                        Background = ((Run)i).Background,
        //                        BaselineAlignment = ((Run)i).BaselineAlignment,
        //                        FontFamily = ((Run)i).FontFamily,
        //                        FontSize = ((Run)i).FontSize,
        //                        FontStyle = ((Run)i).FontStyle,
        //                        FontStretch = ((Run)i).FontStretch,
        //                        FontWeight = ((Run)i).FontWeight,
        //                        Foreground = ((Run)i).Foreground,
        //                        Style = ((Run)i).Style,
        //                        Tag = ((Run)i).Tag,
        //                        TextDecorations = ((Run)i).TextDecorations,
        //                        TextEffects = ((Run)i).TextEffects

        //                    };

        //                    //MessageBox.Show(run.Text);
        //                    //var run = (Run)spanInline;
        //                    var tmp = new RichTextBox();
        //                    var pa = new Paragraph();
        //                    pa.Inlines.Add(run);
        //                    tmp.Document.Blocks.Add(pa);
        //                    sb.Append(ConvertToString(tmp));
        //                    //foreach (var source in ((Paragraph)b).Inlines.ToArray())
        //                    //{
        //                    //    if (source == i)
        //                    //    {
        //                    //        var run = (Run)source;
        //                    //        var tmp = new RichTextBox();
        //                    //        var pa = new Paragraph();
        //                    //        pa.Inlines.Add(run);
        //                    //        tmp.Document.Blocks.Add(pa);
        //                    //        sb.Append(ConvertToString(tmp));
        //                    //    }

        //                    //}
        //                }



        //            }
        //        }
        //    }





        //    //foreach (Block b in myRichTextBox.Document.Blocks.ToArray())
        //    //{
        //    //    var paragraph = b as Paragraph;
        //    //    //if (b is Table)
        //    //    //{
        //    //    //    var tbTmp = b as Table;
        //    //    //    tbTmp.BorderBrush = Brushes.Black;
        //    //    //    tbTmp.BorderThickness = new Thickness(5, 10, 15, 20);
        //    //    //    var tmpTable = new RichTextBox();
        //    //    //    tmpTable.Document.Blocks.Add(tbTmp);
        //    //    //    sb.Append(ConvertToString(tmpTable));
        //    //    //}
        //    //    //else 
        //    //    if (paragraph != null)
        //    //    {
        //    //        new Paragraph();
        //    //        var bpara = (Paragraph)Utility.CloneElement(paragraph);
        //    //        //var bpara = paragraph;
        //    //        foreach (Inline inline in (bpara).Inlines.ToArray())
        //    //        {

        //    //            if (inline is InlineUIContainer)
        //    //            {

        //    //                var uiContainer = (InlineUIContainer)inline;
        //    //                if (uiContainer.Child is RichTextBox)
        //    //                {
        //    //                    sb.Append(value: (ConvertToString((RichTextBox)uiContainer.Child)));
        //    //                }
        //    //                else if (uiContainer.Child is Image)
        //    //                {
        //    //                    var tmp1 = new RichTextBox();
        //    //                    var pa1 = new Paragraph();
        //    //                    var replacementImage = uiContainer.Child as Image;
        //    //                    pa1.Inlines.Add(CopyImage(replacementImage.Source as BitmapSource));
        //    //                    tmp1.Document.Blocks.Add(pa1);
        //    //                    sb.Append(ConvertToString(tmp1));
        //    //                }

        //    //            }
        //    //            else
        //    //            {
        //    //                foreach (var source in bpara.Inlines.ToArray())
        //    //                {
        //    //                    if (source == inline)
        //    //                    {
        //    //                        var run = (Run)source;
        //    //                        var tmp = new RichTextBox();
        //    //                        var pa = new Paragraph();
        //    //                        pa.Inlines.Add(run);
        //    //                        tmp.Document.Blocks.Add(pa);
        //    //                        sb.Append(ConvertToString(tmp));
        //    //                    }
        //    //                }



        //    //                //if (!typeAction.Equals("Export"))
        //    //                //{
        //    //                //    foreach (var source in bpara.Inlines.ToArray())
        //    //                //    {
        //    //                //        if (source == inline)
        //    //                //        {
        //    //                //            var run = (Run)source;
        //    //                //            var tmp = new RichTextBox();
        //    //                //            var pa = new Paragraph();
        //    //                //            pa.Inlines.Add(run);
        //    //                //            tmp.Document.Blocks.Add(pa);
        //    //                //            sb.Append(ConvertToString(tmp));
        //    //                //        }
        //    //                //    }
        //    //                //}
        //    //                //else
        //    //                //{
        //    //                //    foreach (var source in bpara.Inlines.ToArray())//chat o day luon di
        //    //                //    {

        //    //                //        if (source == inline && !(source is Span))
        //    //                //        {
        //    //                //            //if (source == inline)
        //    //                //            //{
        //    //                //            var run = (Run)source;
        //    //                //            var tmp = new RichTextBox();
        //    //                //            var pa = new Paragraph();
        //    //                //            pa.Inlines.Add(run);
        //    //                //            tmp.Document.Blocks.Add(pa);
        //    //                //            sb.Append(ConvertToString(tmp));
        //    //                //        }
        //    //                //        else if (source == inline && (source is Span))
        //    //                //        {
        //    //                //            var tmp = new RichTextBox();
        //    //                //            var stmp = (Span)source;

        //    //                //            var textr = new TextRange(stmp.ContentStart, stmp.ContentEnd);
        //    //                //            //if (typeAction.Equals("Export"))
        //    //                //            //{
        //    //                //            textr.Text = textr.Text + "\n";
        //    //                //            //}

        //    //                //            //var textRange = new TextRange(flowDocument.ContentStart, flowDocument.ContentEnd);
        //    //                //            //tmp.Document.Blocks.Add(stmp);
        //    //                //            //Log.Debug(textr.Text);
        //    //                //            var stream = new MemoryStream();
        //    //                //            textr.Save(stream, DataFormats.Rtf);
        //    //                //            var strStream = Encoding.UTF8.GetString(stream.ToArray());

        //    //                //            //return strStream;
        //    //                //            sb.Append(strStream);
        //    //                //        }
        //    //                //        else if (source == inline && (source is Table))
        //    //                //        {
        //    //                //        }
        //    //                //    }
        //    //                //}



        //    //            }

        //    //            //else if(inline is Run)
        //    //            //{

        //    //            //        //if (source == inline)
        //    //            //        //{
        //    //            //            var run = (Run)inline;
        //    //            //            var tmp = new RichTextBox();
        //    //            //            var pa = new Paragraph();
        //    //            //            pa.Inlines.Add(run);
        //    //            //            tmp.Document.Blocks.Add(pa);
        //    //            //            sb.Append(ConvertToString(tmp));
        //    //            //       // }
        //    //            //        //xu li span
        //    //            //        //else
        //    //            //        //{
        //    //            //        //    var tmp = new RichTextBox();
        //    //            //        //    Span stmp = (Span)source;
        //    //            //        //    var textr = new TextRange(stmp.ContentStart, stmp.ContentEnd);
        //    //            //        //    textr.Text = textr.Text + "\n";
        //    //            //        //    //var textRange = new TextRange(flowDocument.ContentStart, flowDocument.ContentEnd);
        //    //            //        //    //tmp.Document.Blocks.Add(stmp);
        //    //            //        //    Log.Debug(textr.Text);
        //    //            //        //    var stream = new MemoryStream();
        //    //            //        //    textr.Save(stream, DataFormats.Rtf);
        //    //            //        //    var strStream = Encoding.UTF8.GetString(stream.ToArray());

        //    //            //        //    //return strStream;
        //    //            //        //    sb.Append(strStream);
        //    //            //        //}
        //    //            //    //}
        //    //            //}


        //    //        }
        //    //    }
        //    //}

        //    return sb.ToString();
        //}
        private static FlowDocument flowDocument;//= new FlowDocument();
        private static Paragraph bpara;//= new Paragraph();
        public static FlowDocument GetInlineText(RichTextBox myRichTextBox, string typeAction)
        {
            flowDocument = new FlowDocument();
            bpara = new Paragraph();
            RecursiveGetInlineText(myRichTextBox, typeAction);
            return flowDocument;
        }
        public static void RecursiveGetInlineText(RichTextBox myRichTextBox, string typeAction)
        {
            //var sb = new StringBuilder();
            
            //sb.Append(SaveRTB(myRichTextBox));
            //byte[] bytes;

            foreach (Block b in myRichTextBox.Document.Blocks)
            {
                if (b is Paragraph)
                {
                    
                    foreach (Inline i in ((Paragraph)b).Inlines)
                    {
                        var inlineType = i.GetType();

                        if (inlineType == typeof(InlineUIContainer))
                        {
                            var uic = ((InlineUIContainer)i);
                            if (uic.Child.GetType() == typeof(InlineRichTextBox))
                            {
                                //sb.Append(value: (ConvertToString((RichTextBox)uic.Child)));
                                //lstRtb.Add((RichTextBox)uic.Child);
                                //var temp = (FlowDocument)Utility.CloneElement(((RichTextBox) uic.Child).Document);
                                //flowDocument.Blocks.Add(bpara);
                                bpara.Inlines.Add(new LineBreak());
                                RecursiveGetInlineText((RichTextBox)uic.Child, typeAction);
                            }
                            else //if (uic.Child.GetType() == typeof(Image))
                            {
                                //var tmp1 = new RichTextBox();
                                //var pa1 = new Paragraph();
                                
                                //var replacementImage = uic.Child as Image;
                                //if (replacementImage != null)
                                    //pa1.Inlines.Add(CopyImage(replacementImage.Source as BitmapSource));
                                bpara.Inlines.Add((Inline)Utility.CloneElement(i));
                                //flowDocument.Blocks.Add(pa1);
                                //sb.Append(ConvertToString(tmp1));
                                //lstRtb.Add(tmp1);
                            }
                           
                        }
                        else if (inlineType == typeof(Span))
                        {
                            foreach (var spanInline in ((Span)i).Inlines)
                            {
                                var spanInlineType = spanInline.GetType();

                                if (spanInlineType == typeof(InlineUIContainer))
                                {
                                    var uic = ((InlineUIContainer)spanInline);

                                    if (uic.Child.GetType() == typeof(InlineRichTextBox))
                                    {
                                        //Log.Debug(ConvertToString((RichTextBox)uic.Child));
                                        //sb.Append(value: (ConvertToString((RichTextBox)uic.Child)));
                                        //lstRtb.Add((RichTextBox)uic.Child);
                                        //var temp = (FlowDocument)Utility.CloneElement(((RichTextBox)uic.Child).Document);
                                        //flowDocument.Blocks.AddRange(temp.Blocks.ToArray());
                                        //flowDocument.Blocks.Add(bpara);
                                        bpara.Inlines.Add(new LineBreak());
                                        RecursiveGetInlineText((RichTextBox)uic.Child, typeAction);
                                    }
                                    else //if (uic.Child.GetType() == typeof(Image))
                                    {
                                        //var tmp1 = new RichTextBox();
                                        //var pa1 = new Paragraph();
                                        //var replacementImage = uic.Child as Image;
                                        //if (replacementImage != null)
                                        //    pa1.Inlines.Add(CopyImage(replacementImage.Source as BitmapSource));
                                        //flowDocument.Blocks.Add(pa1);
                                        //sb.Append(ConvertToString(tmp1));
                                        //lstRtb.Add(tmp1);
                                        bpara.Inlines.Add((Inline)Utility.CloneElement(spanInline));
                                    }
                                }
                                else
                                {
                                    //var run = (Run)spanInline;

                                    //var run = new Run
                                    //{
                                    //    Text = ((Run)spanInline).Text,
                                    //    Background = ((Run)spanInline).Background,
                                    //    BaselineAlignment = ((Run)spanInline).BaselineAlignment,
                                    //    FontFamily = ((Run)spanInline).FontFamily,
                                    //    FontSize = ((Run)spanInline).FontSize,
                                    //    FontStyle = ((Run)spanInline).FontStyle,
                                    //    FontStretch = ((Run)spanInline).FontStretch,
                                    //    FontWeight = ((Run)spanInline).FontWeight,
                                    //    Foreground = ((Run)spanInline).Foreground,
                                    //    Style = ((Run)spanInline).Style,
                                    //    Tag = ((Run)spanInline).Tag,
                                    //    TextDecorations = ((Run)spanInline).TextDecorations,
                                    //    TextEffects = ((Run)spanInline).TextEffects

                                    //};

                                    ////MessageBox.Show(run.Text);
                                    ////var run = (Run)spanInline;
                                    ////var tmp = new RichTextBox();
                                    //var pa = new Paragraph();
                                    //pa.Inlines.Add((Run)Utility.CloneElement(spanInline));
                                    ////tmp.Document.Blocks.Add(pa);
                                    ////sb.Append(ConvertToString(tmp));
                                    ////lstRtb.Add(tmp);
                                    //flowDocument.Blocks.Add(pa);
                                    bpara.Inlines.Add((Inline)Utility.CloneElement(spanInline));
                                }
                            }
                        }
                        else
                        {
                            //var run = new Run
                            //{
                            //    Text = ((Run)i).Text,
                            //    Background = ((Run)i).Background,
                            //    BaselineAlignment = ((Run)i).BaselineAlignment,
                            //    FontFamily = ((Run)i).FontFamily,
                            //    FontSize = ((Run)i).FontSize,
                            //    FontStyle = ((Run)i).FontStyle,
                            //    FontStretch = ((Run)i).FontStretch,
                            //    FontWeight = ((Run)i).FontWeight,
                            //    Foreground = ((Run)i).Foreground,
                            //    Style = ((Run)i).Style,
                            //    Tag = ((Run)i).Tag,
                            //    TextDecorations = ((Run)i).TextDecorations,
                            //    TextEffects = ((Run)i).TextEffects

                            //};

                            //MessageBox.Show(run.Text);
                            //var run = (Run)spanInline;
                            //var tmp = new RichTextBox();
                            //var pa = new Paragraph();
                            //pa.Inlines.Add((Run)Utility.CloneElement(i));
                            ////tmp.Document.Blocks.Add(pa);
                            ////sb.Append(ConvertToString(tmp));
                            ////lstRtb.Add(tmp);
                            //flowDocument.Blocks.Add(pa);
                            bpara.Inlines.Add((Inline)Utility.CloneElement(i));
                        }
                    }
                    flowDocument.Blocks.Add(bpara);
                    bpara = new Paragraph();
                }
                else
                {
                    flowDocument.Blocks.Add((Block)Utility.CloneElement(b));
                }
            }


            //return sb.ToString();
            //return flowDocument;
        }




      

        public static Image CopyImage(BitmapSource bitmapSource)
        {
            var targetImage = new Image { Source = bitmapSource, Width = 100 };

            return targetImage;

        }

    }
}
